home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Emulatoren / UAE0.6.4 / src / serial.c < prev    next >
C/C++ Source or Header  |  2000-05-27  |  3KB  |  126 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   *  Serial Line Emulation
  5.   *
  6.   * (c) 1996 Stefan Reinauer
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "memory.h"
  15. #include "custom.h"
  16. #include "newcpu.h"
  17.  
  18. void serial_init(void);
  19. void serial_exit(void);
  20.  
  21. UWORD SERDATR(void);
  22. void  SERPER(UWORD w);
  23. void  SERDAT(UWORD w);
  24.  
  25. int sersend;
  26. int serrecv;
  27. int sd = -1;
  28.  
  29. UWORD serdat;
  30.  
  31. void SERPER(UWORD w)
  32. {
  33.     if (!use_serial)
  34.     return;
  35.  
  36. #ifndef __DOS__
  37.     if (w&0x8000) fprintf (stdout, "SERPER: 9 Bit Transmission not implemented\n");
  38.     fprintf (stdout, "serial port baudrate set to ");
  39.     switch (w & 0x7fff)
  40.     {
  41.      case 0x2e9b: fprintf (stdout, "  300\n"); return;
  42.      case 0x0ba6: fprintf (stdout, " 1200\n"); return;
  43.      case 0x02e9: fprintf (stdout, " 4800\n"); return;
  44.      case 0x0174: fprintf (stdout, " 9600\n"); return;
  45.      case 0x00b9: fprintf (stdout, "19200\n"); return;
  46.      case 0x005c: fprintf (stdout, "38400\n"); return;
  47.      default:
  48.     fprintf(stdout,"%d (approx.)\n",
  49.         (unsigned int)(3579546.471/(double)((w&0x7fff)+1)));  return;
  50.     }
  51. #else
  52.     if (w&0x8000) fprintf (stderr, "SERPER: 9 Bit Transmission not implemented\n");
  53.     fprintf (stderr, "serial port baudrate set to ");
  54.     switch (w & 0x7fff)
  55.     {
  56.      case 0x2e9b: fprintf (stderr, "  300\n"); return;
  57.      case 0x0ba6: fprintf (stderr, " 1200\n"); return;
  58.      case 0x02e9: fprintf (stderr, " 4800\n"); return;
  59.      case 0x0174: fprintf (stderr, " 9600\n"); return;
  60.      case 0x00b9: fprintf (stderr, "19200\n"); return;
  61.      case 0x005c: fprintf (stderr, "38400\n"); return;
  62.      default:
  63.     fprintf(stderr,"%d (approx.)\n",
  64.         (unsigned int)(3579546.471/(double)((w&0x7fff)+1)));  return;
  65.     }
  66. #endif
  67. }
  68.  
  69. void SERDAT(UWORD w)
  70. {
  71.     char z;
  72.  
  73.     if (!use_serial)
  74.     return;
  75.  
  76.     fprintf(stderr,"SERDAT: wrote 0x%04x\n",w);
  77.     z=(char)(w&0xff);
  78.     if (sd>0) {
  79.     write (sd,&z,1);
  80.     }   
  81.     return;
  82. }
  83.  
  84. UWORD SERDATR(void)
  85. {
  86.     char z;
  87.  
  88.     if (!use_serial)
  89.     return;
  90.  
  91.     if ((read (sd, &z,1))==1) {
  92.     serdat=0x6100;
  93.     intreq|=0x0800;
  94.     serdat+=(int)z;
  95. #ifndef __DOS__
  96.     fprintf (stdout,"SERDATR: received 0x%02x\n",(int)z);
  97. #else
  98.     fprintf (stderr,"SERDATR: received 0x%02x\n",(int)z);
  99. #endif
  100.     }
  101.     return serdat;
  102. }
  103.  
  104. void serial_init(void)
  105. {
  106.     if (!use_serial)
  107.     return;
  108.  
  109. #ifndef __DOS__
  110.     if ((sd=open(sername,O_RDWR|O_NONBLOCK))<0)
  111.     fprintf (stderr,"Error: Could not open Device %s\n",sername);
  112. #else
  113.     if ((sd=open(sername,O_RDWR|O_NONBLOCK|O_BINARY))<0)
  114.     fprintf (stderr,"Error: Could not open Device %s\n",sername);
  115. #endif
  116.     serdat=0x2000;
  117.     return;
  118. }
  119.  
  120. void serial_exit(void)
  121. {
  122.     if (sd >= 0)
  123.     close(sd);
  124.     return;
  125. }
  126.